perm filename PRELPC.OSA[1,ALS] blob sn#001050 filedate 1972-07-10 generic text, type T, neo UTF8
00010	ENTRY PREPARE;
00020	BEGIN "XPREPARE"
00030	
00040	DEFINE ⊂="COMMENT";	⊂ This package contains all of the procedures
00050	that are used to process the input to obtain data in a form suitable
00060	for use in the signature tables which, in turn are processed by a
00070	separate MAC package SIG.;
00080	
00100	⊂  MODIFIED WED 21ST AT 1600 HRS 1.FIX COUNT IN INSET 2.AVE←LOG R0;
00110	EXTERNAL REAL ARRAY A,B,C[0:256];
00120	EXTERNAL INTEGER ARRAY INRAW,INDAT,INSUB,INDIV,INCNT,INNAM[0:24];
00125	DEFINE LISSIZ="760";
00127	EXTERNAL INTEGER ARRAY LIST[0:LISSIZ];
00130	EXTERNAL INTEGER ARRAY SUMDAT[0:1536];
00140	EXTERNAL INTEGER M,N,P;
00150	EXTERNAL INTEGER MINK,MINLOC,MAXK,MAXLOC,SEGC,SEGMRK,STEPS,INFLAG;
00152	EXTERNAL FORTRAN REAL PROCEDURE ALOG10(REAL X);
00155	         INTEGER ARRAY DELDAT[0:24];
00160	
00170	PROCEDURE INSET;
00180	BEGIN
00190	IF INRAW[P]<INSUB[P] THEN INSUB[P]←INRAW[P];
00200	IF INDIV[P]<INRAW[P] THEN INDIV[P]←INRAW[P];
00220	⊂  INCNT[P]←INCNT[P]+1;
00270	END "INSET";
00280	
00290	
00300	REAL SX;INTEGER NC; ⊂  **** SX GIVES FREQ INCREMENT PER FFT POINT ;
00310	                    ⊂  **** NC IS THE NO OF FFT POINTS;
00320	DEFINE SPEC="C"      ;  ⊂ **** ARRAY FOR FFT;
00330	
00340	
00350	⊂ **** GLOBALS FOR PARAEX ;
00355	EXTERNAL REAL R0 ;
00360	EXTERNAL INTEGER NP,NZ,FP1,FP2,FZ ;
00365	EXTERNAL REAL NPA,NZA,FP1A,FP2A,FZA, LPE,HPE,AVE ;
00370	EXTERNAL INTEGER ARRAY FF[1:5] ; EXTERNAL REAL ARRAY AMP[1:5] ;
00380	REAL PROCEDURE BAL(INTEGER M);
00381	BEGIN REAL XX;
00382	   XX←M-((SPEC[M-1]-SPEC[M+1])/(SPEC[M-1]+SPEC[M]+SPEC[M+1]));
00383	   RETURN(XX);
00384	END "BAL";
00385	
00386	INTEGER PROCEDURE ABS(INTEGER M);
00387	 BEGIN IF M<0 THEN M←-M; RETURN(M) END ;
00390	
00400	⊂ **** GLOBAL PARAMETER RANGES. SET IN "MAIN" PROGRAMME;
00410	EXTERNAL INTEGER I1L,I1H,I2L,I2H,I3L,I3H,
00415	  INL,INH,NZRNG,  FP1L,FP1H,FP2L,FP2H,
00420	        ILPB,ILPC,  IHPB,IHPC   ;	
00425	⊂ THE PARA LIMITS ARE (DOUBLE CHECK)
00428	    F1=200/800  F2=700/2050  F3=2000/3200
00431	    NP=800/1500  NZRNG=NP+/-500 ?
00432	    FP1=1800/3200   FP2=3200/5000   LPE=300/450  HPE=2500/3000 ;
00433	⊂ **** I2H CHANGED FROM 28 TO 26 ESCAPE HI AMP F3 ;
00434	⊂ SX←SF/(2.*NC),I1L←200./SX,P.I1H←800./SX+.5,I2L←700./SX;
00435	⊂ I2H←2050./SX+.5, I3L←1950./SX, I3H←3250./SX+.5; 
00437	⊂ INL←800./SX, INH←1500./SX+.5, NZRNG←500./SX+.5;
00438	⊂  FP1L←1800./SX, FP1H←3200./SX,FP2L←3200./SX+.5,FP2H←5000./SX+.5;
00439	⊂  ILPB←300./SX, ILPC←450./SX, IHPC←2500./SX, IHPB←3000./SX;
00440	
00441	 PROCEDURE F2DECI;
00442	⊂ **** DECIDE IF F2 CLOSE TO F1;
00443	⊂ ********* FIX TH & 12.(DBS) ONLY AFTER EXING I'S U'S AND A'S;
00444	
00445	BEGIN
00446	REAL SUML,SUMH,TH;  INTEGER I;
00447	
00448	TH←6.0 ;  SUML←0.;
00449	   FOR I←I2L STEP 1 UNTIL I1H DO  SUML←SUML+SPEC[I];
00450	   SUML←SUML/(I1H-I2L+1.0);
00451	
00452	   SUMH←0.; FOR I←I3L STEP 1 UNTIL I2H DO SUMH←SUMH+SPEC[I];
00453	              SUMH←SUMH/(I2H-I3L+1.0);
00454	
00455	     IF SUML>SUMH+TH+12.0  THEN FF[2]←FF[1]+1 ; 
00456	⊂ OUTSTR(NL&"SUML="&CVF(SUML)&"SUMH="&CVF(SUMH));
00457	END "F2DECI";
00458	
00459	
00460	
00461	 INTEGER PROCEDURE PEAK(INTEGER I1,I2);
00462	⊂ **** THIS PROCEDURE LOOKS AT A SECTION BETWEEN I1 & I2 AND LOCATES 
00463	            A PROPER PEAK;
00464	BEGIN
00465	  LABEL L1,L2; REAL YMX; INTEGER I,IX; 
00466	  YMX←-1000.0;
00467	  L1: FOR I←I1 STEP 1 UNTIL I2 DO
00468	       IF YMX<SPEC[I] THEN BEGIN YMX←SPEC[I]; IX←I END;
00469	       IF IX=I1 THEN   BEGIN
00470	          WHILE YMX>SPEC[I1+1] DO
00471	            BEGIN I1←I1+1; IF I1=I2 THEN GOTO L2; YMX←SPEC[I1] END;
00472	               GOTO L1 END;
00473	  IF IX=I2 THEN  BEGIN
00474	     WHILE YMX>SPEC[I2-1] DO
00475	      BEGIN I2←I2-1; IF I2=I1 THEN GOTO L2;
00476	        YMX←SPEC[I2] END; 
00477	            GO TO L1; END;
00478	     RETURN(IX);
00479	⊂  OUTSTR(NL&NL&"NO PROPER PEAKS IN NO="&CVS(N));L2: RETURN(IX);
00480	 END "PEAK";
00490	INTEGER I,J;
00500	PROCEDURE FORMANTS;
00510	⊂ ****  I1L,I1H,I2L,I2H,I3L,I3H DEFINE THE RANGES RES FORMANTS;
00520	⊂ **** SPEC[FFT,TIME]=SPECTRUM(GLOBAL);
00530	⊂ **** INTEGER FF[5]& REAL AMP[5] (GLOBAL);
00540	⊂ **** LOWER F2H LIMIT TO AVOID HIGH ENERGY F3,
00545	   CATCH PROPER F2 BY AMP COMPARISON;
00550	
00560	BEGIN
00570	 IF INFLAG=1 THEN BEGIN
00580	INNAM[P]←LIST[P]←CVSIX("F1"); INNAM[P+1]←LIST[P+1]←CVSIX("F2");P←P+2;
00590	INNAM[P]←LIST[P]←CVSIX("F3");INNAM[P+1]←LIST[P+1]←CVSIX("A1");P←P+2;
00600	INNAM[P]←LIST[P]←CVSIX("A2");
00602	INNAM[P+1]←LIST[P+1]←CVSIX("A3"); P←P+2;
00605	  END ELSE BEGIN
00610	  INTEGER I;⊂ EXTERNAL INTEGER PROCEDURE PEAK(INTEGER I1,I2);
00620	⊂  EXTERNAL PROCEDURE  F2DECI;
00630	  FF[1]←PEAK(I1L,I1H);
00640	  FF[2]←PEAK(I2L,I2H);
00650	  FF[3]←PEAK(I3L,I3H);
00660	  IF FF[1]=FF[2] THEN FF[2]←PEAK(I1H,I2H); 
00670	  ⊂ **** F2DECI ON SPECTRAL BALANCE  ;
00680	⊂  IF SPEC[FF[2]]+6.0<SPEC[FF[3]] THEN BEGIN FF[2]←FF[3] ;
00690	⊂                                      FF[3]←PEAK(FF[3],I3H)  END  ; 
00700	
00710	  IF FF[2]=FF[3]  THEN FF[3]←PEAK(FF[3],I3H) ;
00720	⊂  FF[4]←PEAK(I1H,I3L);
00730	⊂  FF[5]←PEAK(I3H,I3H+10);
00740	   FOR I←1 STEP 1 UNTIL 3 DO
00750	     AMP[I]←SPEC[FF[I]];
00780	INDAT[P]←(FF[1]*7)-20; P←P+1;
00790	INDAT[P]←(FF[2]*3.7)-30; P←P+1;
00800	INDAT[P]←(FF[3]*3.7)-90; P←P+1;
00810	INDAT[P]←(AMP[1]*1.7)+18; P←P+1;
00820	INDAT[P]←(AMP[2]*2)+15; P←P+1;
00830	INDAT[P]←(AMP[3]*3.2)+15; P←P+1;
00840	
00850	
01000	END;
01010	END "FORMANTS";
01210	
01220	
01230	
01240	PROCEDURE FRINAS  ;  BEGIN
01250	 IF INFLAG=1 THEN BEGIN
01260	INNAM[P]←LIST[P]←CVSIX("FP1");
01265	INNAM[P+1]←LIST[P+1]←CVSIX("FP1A");P←P+2;
01270	INNAM[P]←LIST[P]←CVSIX("FP2")
01272	;INNAM[P+1]←LIST[P+1]←CVSIX("FP2A");P←P+2;
01275	INNAM[P]←LIST[P]←CVSIX("FZ");
01277	INNAM[P+1]←LIST[P+1]←CVSIX("FZA");P←P+2;
01280	INNAM[P]←LIST[P]←CVSIX("NP");
01285	INNAM[P+1]←LIST[P+1]←CVSIX("NPA");P←P+2;
01290	INNAM[P]←LIST[P]←CVSIX("NZ");
01292	 INNAM[P+1]←LIST[P+1]←CVSIX("NZA"); P←P+2;  END ELSE BEGIN
01295	⊂ EXTERNAL INTEGER PROCEDURE PEAK(INTEGER I1,I2);
01300	NP←PEAK(INL,INH);  FP1←PEAK(FP1L,FP1H);  FP2←PEAK(FP2L,FP2H);
01305	FP1A←SPEC[FP1]; FP2A←SPEC[FP2]; NPA←SPEC[NP];
01310	  BEGIN "ZEROS" REAL XNZ; INTEGER STP,JX,J;
01320	        STP←(NZRNG)/ABS(NZRNG);  XNZ←10000.;
01330	        FOR J←NP STEP STP UNTIL NP+NZRNG DO 
01340	            IF XNZ>SPEC[J] THEN BEGIN XNZ←SPEC[J]; JX←J  END;
01350	        NZ←JX;  NZA←SPEC[NZ];   XNZ←10000.;
01360	     FOR J←FP1 STEP 1 UNTIL FP2  DO 
01370	          IF XNZ>SPEC[J] THEN BEGIN XNZ←SPEC[J]; JX←J  END;
01380	        FZ←JX;  FZA←SPEC[FZ];
01390	  END "ZEROS";
01391	INDAT[P]←(FP1*3.8)-86; P←P+1;
01393	INDAT[P]←(FP1A*3.3)+15; P←P+1;
01395	INDAT[P]←(FP2*2.4)-90; P←P+1;
01397	INDAT[P]←(FP2A*3)+27; P←P+1;
01399	INDAT[P]←(FZ*3)-97; P←P+1;
01401	INDAT[P]←(FZA*4.4)+55; P←P+1;
01403	INDAT[P]←(NP*6.3)-60; P←P+1;
01405	INDAT[P]←(NPA*2.1)+19; P←P+1;
01407	INDAT[P]←(NZ*6)-83; P←P+1;
01409	INDAT[P]←(NZA*4.5)+45; P←P+1;
01411	
01413	
01419	END;
01424	END "FRINAS";
01430	PROCEDURE SEGPAR;
01440	BEGIN "SEGPAR"
01450	 IF INFLAG=1 THEN BEGIN
01460	INNAM[P]←LIST[P]←CVSIX("LPE");
01465	INNAM[P+1]←LIST[P+1]←CVSIX("AVE");P←P+2;
01470	  INNAM[P]←LIST[P]←CVSIX("HPE"); P←P+1; END ELSE BEGIN
01480	INTEGER J,K;
01490	⊂ *****  COMPUTE LOW-PASS POWER ;
01500	   LPE←0.0;
01510	     FOR J←1 STEP 1 UNTIL ILPB DO
01520	         LPE←LPE+SPEC[J];
01530	      
01540	     K←ILPC-ILPB;
01550	     FOR J←ILPB+1 STEP 1 UNTIL ILPC DO LPE←LPE+(SPEC[J]*(ILPC-J)/K);
01560	     LPE←LPE/ILPC;
01570	
01580	⊂ ***** COMPUTE HIGH-PASS POWER;
01590	
01600	   HPE←0.0; K←IHPB-IHPC;
01610	     FOR J←IHPC STEP 1 UNTIL IHPB-1 DO HPE←HPE+(SPEC[J]*(J-IHPC)/K);
01620	     FOR J←IHPB STEP 1 UNTIL NC DO HPE←HPE+SPEC[J];
01630	         HPE←HPE/(NC-IHPC);
01640	
01650	⊂ ***** COMPUTE AVERAGE POWER;
01660	     AVE←0.0;
01670	AVE←5.*ALOG10(R0);
01675	   R0←AVE; ⊂   FOR J←0 STEP 1 UNTIL NC DO AVE←AVE+SPEC[J];
01680	⊂       AVE←AVE/NC*R0;  HPE←HPE*R0;  ⊂ TO IMPROVE HPE SPREAD ;
01681	INDAT[P]←(LPE*3)+27; P←P+1;
01686	INDAT[P]←(AVE*4.3)-84; P←P+1;
01688	INDAT[P]←(HPE*0.7)+95; P←P+1;
01690	END;
01700	END "SEGPAR";
01710	
     

00020	
00030	INTERNAL PROCEDURE PREPARE;
00040	BEGIN
00200	
00250	P←0;
00275	  ⊂ Each procedure puts results in sequential locations in INRAW[P]
00300	and calls INSET which computes corresponding values INDAT[P]
00325	and updates P;
00350	P←0; NC←N;
00400	FOR I←0 STEP 1 UNTIL 24 DO DELDAT[I]←INDAT[I];
00450	FORMANTS;
00500	FRINAS;
00550	SEGPAR;	
00555	   IF INFLAG=1 THEN BEGIN
00560	      INNAM[P]←LIST[P]←CVSIX("TRVO"); P←P+1;
00565	      INNAM[P]←LIST[P]←CVSIX("TRAN"); P←P+1; END ELSE
00570	BEGIN  REAL SUM;
00600	FOR I←0 STEP 1 UNTIL P DO BEGIN
00650	    IF INDAT[I]>63 THEN INDAT[I]←63 ;
00700	    IF INDAT[I]<0  THEN INDAT[I]←0  ;
00750				  END;
00800	
00805	SUM←0.;⊂  FOR I←0 STEP 1 UNTIL 5 DO SUM←SUM+ABS(INDAT[I]-DELDAT[I]);
00810	⊂ SUM←SUM+ABS(INDAT[16]-DELDAT[16])+ABS(INDAT[17]-DELDAT[17]);
00815	 INDAT[P]←SUM;⊂ INDAT[P]←SUM-20.;⊂ INRAW[P]←SUM;⊂ INSET; P←P+1;
00820	
00825	SUM←0.;
00827	⊂  FOR I←0 STEP 1 UNTIL 18 DO SUM←SUM+ABS(INDAT[I]-DELDAT[I]);
00830	INDAT(P]←SUM;⊂   INDAT[P]←(SUM-70.)*63./110.;
00835	⊂  INRAW[P]←SUM;⊂  INSET; P←P+1;
00840	 IF INDAT[19]>63 THEN INDAT[19]←63;IF INDAT[19]<0 THEN INDAT[19]←0;
00845	IF INDAT[20]>63 THEN INDAT[20]←63;IF INDAT[20]<0 THEN INDAT[20]←0;
00850	END;
00855	END;
00900	END "XPREPARE";
00950